==Спецификация для движка micro.fb==

=Назначение и состав=

Данный движок предназначен для обслуживания книг-игр (книгр) и включает в себя минимум необходимых функций и возможностей. При проектировании движка использовались базовые принципы движка MAGICON.FB. Некоторые функции и процедуры в обоих движках идентичны, использовать их вместе не рекомендуется. Так же в движоке используются некоторые функции библиотеки easy.math. Вот список функций и процедур, используемых в движке:

uc

	Микроотладчик. Любая строка, введённая в поле ввода (строку ввода) интерпретируется как код. Так, например, можно проверить состояние любой переменной, просто введя в поле ввода её имя.

uc.obj

	Расширение микроотладчика. Локация выводит на экран таблицу всех созданных в игре объектов. Вызывается из строки ввода:
		*pl $func('uc.obj')
	Аналог команды all objects table в MAGICON.FB.

onNewLoc

	Служебная локация, выполнение кода на которой происходит всякий раз после перехода на новую локацию по команде goto, xgoto, причём сначала выполняется код локации, на которую был осуществлён переход, а затем только код на onNewLoc. Возможности onNewLoc используются для формирования конечного вида выводимого на экран текста.

save.varriors

	Служебная локация, автоматически сохраняющая состояние всех нужных переменных в специальный массив. Эта функция необходима для того, чтобы дать игроку возможность откатить игру на пару шагов назад. Запись в масиив ведётся только при переходе на новую локацию. Таким образом должна обеспечиваться возможность повторного выбора вплоть до выбора предметов.


set.Screen

	Локация мгновенной настройки интерфейса. Эта процедура возвращает переменным настройки интерфейса те значения, которые необходимы в текущий момент. Создана для облегчения переключения между различными режимами настройки интерфейса. В передаваемом аргументе процедура получает информацию о том, какие настройки следует применить к интерфейсу.

int.Screen

	На этой локации формируется html-страница текущей локации. html усечённый. Фактически это всего-лишь набор таблиц для разнесения блоков текста.

int.DIN

	Функция, заимствованная из движка MAGICON.FB. Является усечённым аналогом функции int.din.text. Преобразует исходный текст описания локации в текст с правильной html разметкой и преобразованный в соответствии с текущим состоянием игры.

int.DINSTR

	Функция, расширяющая возможности int.DIN. Преобразует строку вида [tag]текст[/tag] в текст или форматированный текст, в соответствии с назначением тега. Например, [cur]Обновить страницу[/cur] после обработки этой функцией будет преобразовано в
		<a href="exec:goto '<<$curloc>>'" title="возврат на текущую локацию" class="plain">Обновить страницу</a>

int.DINCODE

	Функция, расширяющая возможности int.DIN. Выполняет обработку строки вида <DIN00:code:00DIN>, преобразуя её в динамический код, результат которого возвращается в виде готового текста. Например можно выводить текст в зависимости от состояния переменной:

	<DIN1:
	if blaster_charge>0:
		$result='У вас ещё есть заряды в бластере.'
	else
		$result='У вас не осталось зарядов в бластере.'
	end
	:1DIN>

href.page

	Функция, расширяющая возможности int.DIN. Выполняет преобразование строки вида [page=0]Перейти на страницу 0[/page] в html-ссылку перехода на нужную страницу.

add.obj

	Функция добавляет предмет в рюкзак, или заменяет один из предметов в рюкзаке.

crt.obj

	Функция генерирует предмет, помещая его в указанное местоположение, или на текущую локацию. Результатом функции является идентификатор предмета/объекта.

get.daughter.obj

	Функция, заимствованная из движка MAGICON.FB. Получает список идентификаторов дочерних объектов объекта по ай-ди и возвращает список в указанный массив.

get.word.inPos

	Функция заимстована из библиотеки easy.math. Предназначена для получения строки из конструкции вида

	строка 1|строка 2|...|строка N

	Подробнее читайте в документации к библиотеке easy.math.

run.dynamic.script
	
	Функция заимствована из движка MAGICON.FB. Предназначена для выполнения кода, сопровождающего объект. Более подробно о принципе работы функции читайте в спецификациях движка MAGICON. Здесь же приводится перечень управляющих слов, используемых в движке micro.fb.

	!addobj.id! - функционал для подмены ай-ди при добавлении предмета в рюкзак.
	!addobj.pos! - функционал для подмены местоположения при добавлении предмета в рюкзак.
	!putobj.prv! - функционал для проверки возможности сброса предмета. Можно так же выполнить код непосредственно перед сбросом.
	!eating! - код выполняемый при съедании предмета.

Все прочие функции и процедуры принадлежат исключительно текущей игре и не имеют отношения к micro.fb.

=Создание объекта=

Все объекты создаются простым способом - через процедуру crt.obj. Пример:

gosub 'crt.obj','','INVENTORY','<INVENTORY>',0,1,'ROOF'

Общий вид создания объекта:

gosub 'crt.obj',$args[0],$args[1],$args[2],args[3],args[4],$args[5],$args[6]

, где $args[0] - короткое имя объекта. По этому имени производится поиск объекта в базе стандартных объектов;
$args[1] - предпочтительный идентификатор объекта. Если не указан, присваивается случайным образом;
$args[2] - полное тело объекта, или - в случае присутствия короткого имени объекта - дополнительное тело объекта;
args[3] - заряд объекта;
args[4] - количество объекта;
$args[5] - расположение объекта. Если не указано, объект генерируется на текущей локации.
$args[6] - кусочек кода, сопровождающего объект, который будет выполняться в тех или иных случаях.

Корневого объекта в движке не существует. Вместо него используется идентификатор ROOF. Любой объект, размещённый в ROOF, условно считается корневым.

=Добавление предмета в рюкзак=

Для добавления предмета в рюкзак написана специальная процедура add.obj. Процедура позволяет добавлять предмет в указанную позицию рюкзака. Места в рюкзаке создаются заранее.
Если в рюкзаке на указанном месте уже присутствует предмет, этот предмет сбрасывается на локацию и заменяется добавляемым.
Если место добавления предмета не указано, он добавляется в свободное место в рюкзаке. Если при этом в рюкзаке нет свободного места, выводится строка информации, сообщающая, что свободного места в рюкзаке нет.

=Предметы на локации=

Все предметы, сброшенные на локацию, показываются в виде гиперссылок в самом низу текста локации. За сброшенные на локации предметы отвечает механизм интерпретации сброшенных на локации предметов. Он реализован через несколько функций и процедур.

Иногда необходимо, чтобы предмет, сброшенный на локацию, появлялся непосредственно в тексте самой локации, а не в списке внизу. Для этого в механизм интерпретации сброшенных на локацию предметов встроена специальная проверка на наличие метки [hide.onloc]. При наличии этой метки, предмет не выводится в конечном списке. Чтобы явно указать этот предмет для подъёма на локации прямо в тексте локации, существует специальный тег [obj]идентификатор предмета|текст ссылки до подъёма предмета|текст ссылки после подъёма предмета[/obj].

=Динамический код на локации=

Код, который будет выполняться периодически при наличии.

!war.powerdown! - код выполняемый, когда герой теряет очки силы